/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package byblos.apresentacao.configuracao;

import byblos.negocio.NegocioExcecao;
import byblos.negocio.configuracao.ConfiguracaoEmail;
import byblos.negocio.configuracao.ConfiguracaoEmailUtil;
import java.util.List;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 *
 * @author marano
 */
public class MensagemEmail {

    private String assunto;
    private String texto;
    private String emailEnvio;
    private String emailAdm;
    private String senha;
    private String servidor;
    private String porta;
    private boolean ssl;
    private Session sessao;
    private MimeMessage mensagem;

    public MensagemEmail(String assunto, String texto) {
        this.assunto = assunto;
        this.texto = texto;
        carregarConfig();
        construirMensagem();
    }

    public boolean setFrom(String emailOrigem) {
        try {
            mensagem.setFrom(new InternetAddress(emailOrigem));
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
            return false;
        }
    }

    public boolean addTo(String email) {
        try {
            mensagem.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
    }

    public boolean setToAdm() {
        return addTo(emailAdm);
    }

    public boolean addCopiasOcultas(List<String> emails) {
        InternetAddress[] arrayEmails = new InternetAddress[emails.size()];
        try {
            for (int i = 0; i < arrayEmails.length; i++) {
                arrayEmails[i] = new InternetAddress(emails.get(i));
            }
            mensagem.addRecipients(Message.RecipientType.BCC, arrayEmails);
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
        return true;
    }

    public void enviar() {
        new EnviadorEmail(mensagem);
    }

    private void carregarConfig() {
        ConfiguracaoEmail config = new ConfiguracaoEmailUtil().getConfig();

        if (config == null) {
            throw new NegocioExcecao("O email do sistema não está configurado!");
        }

        emailEnvio = config.getEmailEnvio();
        emailAdm = config.getEmailDestino();
        senha = config.getSenha();
        servidor = config.getServidor();
        porta = config.getPorta();
        ssl = config.isSsl();
    }

    private Properties getPropriedades() {
        Properties props = new Properties();
        props.put("mail.smtp.user", emailEnvio);
        props.put("mail.smtp.host", servidor);
        props.put("mail.smtp.port", porta);
        //props.put("mail.smtp.debug", "true");
        props.put("mail.smtp.socketFactory.port", porta);
        if (ssl) {
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.socketFactory.fallback", "false");
        }
        return props;
    }

    private void construirMensagem() {
        try {
//            SecurityManager seguranca = System.getSecurityManager();
            Authenticator autenticador = new SMTPAuthenticator(emailEnvio, senha);
            sessao = Session.getInstance(getPropriedades(), autenticador);
            sessao.setDebug(true);

            final MimeMessage msg = new MimeMessage(sessao);
//        msg.setText(texto);
            msg.setContent(texto, "text/HTML");
            msg.setSubject(assunto);
            mensagem = msg;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
    }

    private class SMTPAuthenticator extends javax.mail.Authenticator {

        private String email;
        private String senha;

        public SMTPAuthenticator(String email, String senha) {
            this.email = email;
            this.senha = senha;
        }

        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(email, senha);
        }
    }

    private class EnviadorEmail {

        public EnviadorEmail(final MimeMessage email) {
            Thread motorEnvio = new Thread(new Runnable() {

                public void run() {
                    try {
                        mensagem.saveChanges();
                        Transport.send(mensagem);
//                        Transport tr = sessao.getTransport("smtp");
//                        tr.connect(servidor, emailEnvio, senha);
//                        mensagem.saveChanges();      // don't forget this
//                        tr.sendMessage(mensagem, mensagem.getAllRecipients());
//                        tr.close();
                    } catch (MessagingException ex) {
                        ex.printStackTrace();
                    }
                }
            }, "Envio email Fale Conosco");
            motorEnvio.start();
//            try {
//                motorEnvio.join();
//            } catch (InterruptedException ex) {
//                Logger.getLogger(MensagemEmail.class.getName()).log(Level.SEVERE, null, ex);
//            }
        }
    }
}
